/*
 * CDG Software
 * Copyright (C) 2010 Jeff Gordy
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.urbansoft.icl.util;

import org.urbansoft.iso.ISOException;
import org.urbansoft.iso.Padder;

/**
 * Right Justifies Data and Space Pads it.
 */
public class RightJustifySpacePadder implements Padder {
	/**
	 * A padder for padding zeros on the left. This is very common in numeric
	 * fields.
	 */
	public static final RightJustifySpacePadder SPACE_PADDER = new RightJustifySpacePadder(
			' ');

	private char pad;

	/**
	 * Creates a Left Padder with a specific pad character.
	 * 
	 * @param pad
	 *            The padding character. For binary padders, the pad character
	 *            is truncated to lower order byte.
	 */
	public RightJustifySpacePadder(char pad) {
		this.pad = pad;
	}

	/**
	 * Pad.
	 * 
	 * @param data
	 *            the data
	 * @param maxLength
	 *            the max length
	 * 
	 * @return the string
	 * 
	 * @throws ISOException
	 *             the ISO exception
	 * 
	 * @see org.jpos.iso.Padder#pad(java.lang.String, int, char)
	 */
	public String pad(String data, int maxLength) throws ISOException {
		StringBuffer padded = new StringBuffer(maxLength);
		int len = data.length();
		if (len > maxLength) {
			throw new ISOException("Data is too long. Max = " + maxLength);
		} else {
			for (int i = maxLength - len; i > 0; i--) {
				padded.append(pad);
			}
			padded.append(data);
		}
		return padded.toString();
	}

	/**
	 * (non-Javadoc).
	 * 
	 * @param paddedData
	 *            the padded data
	 * 
	 * @return the string
	 * 
	 * @see org.jpos.iso.Padder#unpad(java.lang.String, char)
	 */
	public String unpad(String paddedData) {
		int i = 0;
		int len = paddedData.length();
		while (i < len) {
			if (paddedData.charAt(i) != pad) {
				return paddedData.substring(i);
			}
			i++;
		}
		return "";
	}
}
